package ipl.projet.domaine;

import ipl.projet.domaine.Vaisseau.Vaisseaux;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "JOUEUR_DE_LA_PARTIE", schema = "STARTREK")
public class JoueurDeLaPartie implements Serializable {

	private static final long serialVersionUID = -7991560477663020435L;

	@Id
	@GeneratedValue
	@Column(name = "ID")
	private int id;

	@Column(name = "LOGIN", nullable = false)
	private String login;

	@Column(name = "COULEUR", nullable = false)
	private String couleur;

	@OneToMany(cascade = { CascadeType.ALL })
	@JoinColumn(name = "TIR_ID")
	private List<Tir> listeDesTirs;

	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
	@JoinColumn(name = "JOUEUR_ID")
	private List<Vaisseau> mesVaisseau;

	/* Constructeurs */
	public JoueurDeLaPartie() {
	}

	public JoueurDeLaPartie(String login) {
		this(login, "NONE");
	}

	public JoueurDeLaPartie(Joueur joueur) {
		this(joueur.getLogin(), "NONE");
	}

	public JoueurDeLaPartie(String login, String couleur) {
		this.login = login;
		this.couleur = couleur;
		listeDesTirs = new ArrayList<Tir>();
		mesVaisseau = new ArrayList<Vaisseau>();
		mesVaisseau.add(new Vaisseau(Vaisseau.Vaisseaux.RAVEN));
		mesVaisseau.add(new Vaisseau(Vaisseau.Vaisseaux.NX_CLASS));
		mesVaisseau.add(new Vaisseau(Vaisseau.Vaisseaux.SARAJEVO));
		mesVaisseau.add(new Vaisseau(Vaisseau.Vaisseaux.STEAMRUNNER));
		mesVaisseau.add(new Vaisseau(Vaisseau.Vaisseaux.SOVEREIGN));
	}

	public JoueurDeLaPartie(Joueur joueur, String couleur) {
		this(joueur.getLogin(), couleur);
	}

	/* Getters & Setters */
	public String getLogin() {
		return login;
	}

	public String getCouleur() {
		return couleur;
	}

	public void setCouleur(String couleur) {
		this.couleur = couleur;
	}

	public int getId() {
		return id;
	}

	public List<Tir> getListeDesTirs() {
		return listeDesTirs;
	}

	public void addTir(Tir t) {
		listeDesTirs.add(t);
	}

	public Vaisseau subirTir(Tir t) {

		for (Vaisseau v : mesVaisseau) {
			if (v.estTouche(t)) {
				v.recevoirTir(t);
				return v;
			}

		}
		return null;

	}

	public List<Vaisseau> getMesVaisseau() {
		return mesVaisseau;
	}

	public Vaisseau getVaisseau(String vaisseau) {
		Vaisseaux rsc = Vaisseaux.valueOf(vaisseau);
		for (int i = 0; i < mesVaisseau.size(); i++) {
			if (mesVaisseau.get(i).getType().equals(rsc)) {
				return mesVaisseau.get(i);
			}
		}
		return null;
	}

	public boolean estPret() {
		for (Vaisseau v : mesVaisseau) {
			if (!v.estPlace())
				return false;
		}
		return true;
	}

}
